package service.clazz.strategy;

import entity.param.ClzzParams;
import entity.table.TableDto;
import entity.table.TableFileDto;
import entity.table.TableInfoDto;
import enums.table.ClazzTypeEnum;
import enums.table.TableTypeEnum;
import org.apache.commons.lang.text.StrSubstitutor;
import service.clazz.interfaces.ClazzStrategy;
import utils.common.StrUtil;

import java.util.List;

/**
 * 实体类
 */
public class ClazzMapperStrategy extends ClazzStrategy {

    @Override
    public TableFileDto enerateStrategy(List<TableDto> list, TableInfoDto table) {
        TableFileDto tableFileDto = new TableFileDto();
        tableFileDto.setFileName(table.getTableNameCamel(ClazzTypeEnum.MAPPER)+".xml");
        tableFileDto.setContext(this.bringClazz(list, table));
        return tableFileDto;
    }

    /**
     * 生成类
     */
    public String bringClazz(List<TableDto> list, TableInfoDto tableInfoDto) {
        // 读取 mapper 模板
        String resultStr = readTemple(tableInfoDto.getTemple().getUrl() + "Mapper.ftl");
        // 设置属性
        ClzzParams params = new ClzzParams();
        for (TableDto tableDto : list) {
            if (tableDto.getColumnKey() != null && (tableDto.getColumnKey().equals("UNI") || tableDto.getColumnKey().equals("PRI"))) {
                params.setKeyColumnLower(tableDto.getColumnName());
            }
        }
        params.setEntityPackaging(tableInfoDto.getEntityPackaging());
        params.setEntityName(tableInfoDto.getTableNameCamel());
        params.setNameOriginal(tableInfoDto.getTableNameOriginal());

        params.setBaseColumnList(this.baseColumnList(list));
        params.setBaseResultMap(this.replace(list, tableInfoDto, "resultMap"));
        params.setSelectWhere(this.replace(list, tableInfoDto, "selectWhere"));
        params.setInsertInto(this.replace(list, tableInfoDto, "insertInto"));
        params.setInsertIntoValue(this.replace(list, tableInfoDto, "insertIntoValue"));
        params.setInsertIntoForeachValue(this.replace(list, tableInfoDto, "insertIntoForeachValue"));
        params.setUpdateSet(this.replace(list, tableInfoDto, "updateSet"));

        // 输出
        return new StrSubstitutor(StrUtil.object2Map(params)).replace(resultStr);
    }

    /**
     * baseResultMap
     */
    public String baseColumnList(List<TableDto> list) {
        StringBuilder str = new StringBuilder();

        for (int i=0; i<list.size(); i++) {
            TableDto tableDto = list.get(i);
            if (i%6 == 0) {
                str.append("\t\t");
            }
            str.append(tableDto.getColumnNameSql()).append(",");
            if (i%6 == 5) {
                str.append("\n");
            }
        }

        str.deleteCharAt(str.length()-1);
        return str.toString();
    }

    private String replace(List<TableDto> list, TableInfoDto tableInfoDto, String mapperFileName) {
        StringBuilder str = new StringBuilder();
        String replaceStr = readTemple(tableInfoDto.getTemple().getUrl() + "mapper/" + mapperFileName + ".ftl");
        for (TableDto tableDto : list) {
            ClzzParams params = new ClzzParams();
            // 组装 result 数据
            params.setColumnNameSql(tableDto.getColumnNameSql());
            params.setColumnName(tableDto.getColumnName());
            params.setJdbcType(tableDto.getJdbcType().toUpperCase());
            // 替换后返回结果
            str.append(new StrSubstitutor(StrUtil.object2Map(params)).replace(replaceStr));
        }
        return str.toString();
    }
}
